perm filename PIXFAI.FAI[VIS,HPM]5 blob
sn#216780 filedate 1976-05-27 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00035 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00004 00002 TITLE PIXSUB
C00005 00003 MAKTAB: POP P,RETAD
C00006 00004 PIXEL: POP P,RETAD
C00007 00005 TITLE TVSNAP
C00013 00006 TITLE WIPE ERASE A PICTURE
C00015 00007 PICADD: POP P,RETAD ADD TWO PICTURES
C00016 00008 PICSH: POP P,RETAD RANGE CHANGE
C00017 00009 TVBTMX: POP P,RETAD MIX A CLIPPED 4 BIT INT A MANY BIT PICTURE
C00019 00010 TITLE GRAY
C00022 00011 TITLE SHRINK
C00025 00012 TITLE COPPIC
C00027 00013 TITLE WIXFAI
C00028 00014 AR2TAB: MOVEI T,44 TOTAL BITS/WORD
C00030 00015 HAFPIC: POP P,RETAD
C00034 00016 GETPAR: POP P,RETAD
C00035 00017 PERBIT: POP P,RETAD
C00036 00018 HISTOG: POP P,RETAD
C00038 00019 COLSUM: POP P,RETAD
C00040 00020 ROWSUM: POP P,RETAD
C00041 00021 UNPACK: POP P,RETAD UNPACK A DENSE BYTE ARRAY INTO A PICTURE
C00042 00022 SELECT: POP P,RETAD copy a piece of a picture into another
C00044 00023 ROWSUD: POP P,RETAD much quicker and dirtier than ROWSUM
C00045 00024 DEFINE SHFT1 <TEMP+1>
C00049 00025 TITLE CENTRO
C00053 00026 TITLE INTOP
C00057 00027 INTLOM(VER,HOR,ARRY) INTEREST OPERATOR LOCAL MXIMUM TEST
C00062 00028 TITLE MATCH
C00073 00029 TITLE NORCOR
C00085 00030 TITLE WIXFA1
C00088 00031 CLN: 0
C00089 00032 HIPASS: 0 HI PASS FILTERING
C00092 00033 ***** WIXFA1 SAIL INTERFACE ********
C00094 00034 CLEAN: MOVEM 12,ACS12
C00095 00035 TITLE TEMP
C00096 ENDMK
C⊗;
TITLE PIXSUB
ENTRY MAKTAB,PIXEL,PUTEL
EXTERN CORGET,CORREL
I←1
J←2
K←3
T←4
M←5
AR←6
A←7
B←10
C←11
P←17
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BPTAB←12
LINTAB←←13
RETAD: 0
MAKTAB: POP P,RETAD
POP P,AR
MOVEI I,LINTAB(AR)
HRRM I,RWLP
MOVN I,PCLN(AR) ;USED INTERNALLY TO GENERATE LINE AND
HRLZ I,I ;BYTE TABLES
MOVE J,AR
ADD J,PCLN(AR)
ADD J,LNBYA(AR)
ADDI J,14
RWLP: MOVEM J,LINTAB(I) ;REPLACED BY ACTUAL ADR OF THE LINE TABLE
ADD J,LNWD(AR)
AOBJN I,RWLP
MOVE J,BYBI(AR)
LSH J,30
SUBI J,1
MOVE I,BPTAB(AR)
HRRM I,COLP
MOVEM J,-1(I)
MOVEI J,44
SUB J,BYBI(AR)
LSH J,6
OR J,BYBI(AR)
LSH J,30
MOVN I,LNBYA(AR)
HRLZ I,I
COLP: MOVEM J,BPTAB(I) ;REPLACED BY ACTUAL ADR OF BYTE TABLE
IBP J
AOBJN I,COLP
JRST @RETAD
PIXEL: POP P,RETAD
POP P,J
POP P,I
POP P,AR
MOVEI K,LINTAB(AR)
HRRM K,LNTB
MOVE K,BPTAB(AR)
HRRM K,BPTB
LNTB: MOVE K,LINTAB(I)
BPTB: ADD K,BPTAB(J)
LDB 1,K
JRST @RETAD
PUTEL: POP P,RETAD
POP P,M
POP P,J
POP P,I
POP P,AR
MOVEI K,LINTAB(AR)
HRRM K,LNTB1
MOVE K,BPTAB(AR)
HRRM K,BPTB1
LNTB1: MOVE K,LINTAB(I)
BPTB1: ADD K,BPTAB(J)
DPB M,K
JRST @RETAD
PRGEND
TITLE TVSNAP
ENTRY TVSNAP,TVRAW
EXTERN CORGET,CORREL,TEMP
I←1
J←2
K←3
T←4
M←5
AR←6
A←7
B←10
C←11
P←17
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BPTAB←12
LINTAB←←13
DEFINE RETAD <TEMP>
DEFINE TVBLOK <TEMP+1> ; 0,,0 ; -WC,,ARRDESS OF DATA
; <TEMP+2> 0,,703002 ; B T C V 1 H
; <TEMP+3> 0,,042 ; YDI,,XDI 000
; <TEMP+4> 0
DEFINE YDISP <TEMP+5>
DEFINE RETRY <TEMP+6>
DEFINE NTRY <TEMP+7>
DEFINE RAWF <TEMP+10>
DEFINE RTMAX <TEMP+11>
DEFINE ONETRY <TEMP+12>
DEFINE SGNM <TEMP+13>
; GREY: 12 ↔ 13 ↔ 11 ↔ 10 ↔ 15 ↔ 14 ↔ 16 ↔ 17 ↔ 5 ↔ 4 ↔ 6 ↔ 7 ↔ 2 ↔ 3 ↔ 1 ↔ 0
TVRAW: SETOM RAWF ;TVRAW FOR NO GREY CODE CONVERSION,
JRST TVSNAP+1 ;TVSNAP OTHERWISE
TVSNAP: SETZM RAWF
POP P,RETAD
POP P,T
MOVEM T,ONETRY
MOVMM T,NTRY
POP P,T ;TVSNAP(CAM,YEDG,XEDG,PIC,BCLIP,TCLIP,NTRY)
POP P,B ;
POP P,AR
POP P,J
POP P,I
POP P,K ;GENERATE B T C V 1 H WORD
LSH B,3
OR B,T
LSH B,3
OR B,K
LSH B,11
ORI B,2
MOVEM B,TVBLOK+1
MOVEM I,YDISP
HRLZ I,I ;GENERATE YDI XDI,,WID 000 WORD
HRLZ J,J
OR I,LNWD(AR)
LSH I,11
OR I,J
MOVEM I,TVBLOK+2
MOVN T,PCWD(AR) ;GENERATE -WC,,ADDR
HRLZ T,T
HRR T,LINTAB(AR)
MOVEM T,TVBLOK
MOVEI T,374
SUB T,YDISP
IMUL T,LNWD(AR) ;TO PREVENT RETRIES STARTING AFTER THE
ADD T,LINTAB(AR) ;770'TH LINE. THE FIELD FOR SPECIFYING
MOVEM T,RTMAX ;THIS IS ONLY 777 WIDE
FINSH: CHNSTS 1,A
JUMPE A,.+3
IOPUSH 1,1
HALT
INIT 1,417 ;automatic return if TV not availible
SIXBIT /TV/
0
JRST NOTV ;not available
JRST TVAV1
NOTV: OUTSTR [ASCIZ /
Waiting for TV
/]
INIT 1,1017 ;automatic wait for device
SIXBIT /TV/
0
HALT
TVAV1: SETZM RETRY
TVAV: SETSTS 1,117
MOVEI K,0
SEGNUM K,
MOVEM K,SGNM
DETSEG
LOCK
MOVEI T,324
PEEK T,
PJOB K,
ADD T,K
PEEK T,
INPUT 1,TVBLOK
UNLOCK
MOVE K,SGNM
ATTSEG K,
JRST .+1
MOVE I,TVBLOK+3
TRNN I,20
JRST NXB
OUTSTR [ASCIZ /TV NXM /]
JRST NXA
NXB: OUTSTR [ASCIZ / TV OK /]
NXA: MOVE J,I
LSH T,=27
ADD J,T
MOVEI K,=12
ERLP: HLLZ T,J
LSH J,3
TLZ T,77777
LSH T,-4
TLO T,300000
OUTSTR T
CAIN K,7
OUTSTR [ASCIZ /,,/]
SOJG K,ERLP
OUTSTR [ASCIZ /
/]
NONXM: SKIPL ONETRY ;DO WE WANT TO SUPPRESS PARTIAL
TRNN I,40 ;RETRY FEATURE
JRST TVNM
HLRZ J,I ;PARTIAL SUCCESS, TRY TO GET REST OF DATA
CAMLE J,RTMAX ;MAKE SURE PICTURE BOUNDARY IS NOT
MOVE J,RTMAX ;EXCEEDED
SUB J,LINTAB(AR) ;CALCULATE NEW Y OFFSET
IDIV J,LNWD(AR) ;NEW REDUCED NUMBER OF WORDS AND
MOVE K,TVBLOK+2 ;NEW INCREASED STARTING ADDRESS IN BUFFER
ROT K,11
ANDCMI K,777
ADD K,J
ADD K,J
ADD K,YDISP
ROT K,-11
MOVEM K,TVBLOK+2
IMUL J,LNWD(AR)
MOVE K,J
ADD J,LINTAB(AR)
SUB K,PCWD(AR)
HRL J,K
MOVEM J,TVBLOK
AOS RETRY
JRST TVAV
TVNM: TRNN I,10
JRST [SOSGE NTRY
JRST [SETOM RETRY
JRST TVOK]
AOS RETRY
JRST TVAV ]
TVOK: RELEAS 1,
JUMPE A,.+3
IOPOP 1,1
JRST .+1
SKIPL RAWF
SKIPGE NTRY
JRST TVDUN
MOVN I,PCWD(AR) ;GREY CODE CONVERSION
MOVE J,LINTAB(AR)
HRL J,I
MOVE I,[BYTE (4) 7,7,7,7,7,7,7,7,7]
MOVE M,[BYTE (4) 3,3,3,3,3,3,3,3,3]
GCL: SETCM T,(J) ;| ¬A | ¬B | ¬C | ¬D |
MOVE K,T ;| | | | |
LSH K,-1 ;| | ¬A | ¬B | ¬C |
AND K,I ;| | | | |
XORB T,K ;| ¬A | ¬B⊗¬A | ¬C⊗¬B | ¬D⊗¬C |
LSH K,-2 ;| | | ¬A | ¬B⊗¬A |
AND K,M ;| | | | |
XOR T,K ;| ¬A | ¬B⊗¬A | ¬C⊗¬B⊗¬A | ¬D⊗¬C⊗¬B⊗¬A |
MOVEM T,(J)
AOBJN J,GCL
TVDUN: MOVE 1,RETRY
JRST @RETAD
PRGEND
TITLE WIPE ;ERASE A PICTURE
ENTRY WIPE,PICADD,TVBTMX,PICSH
EXTERN CORGET,CORREL,TEMP
DEFINE RETAD <TEMP>
DEFINE XTAB <TEMP+1>
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BPTAB←←12
LINTAB←←13
T←1 ↔ TT←2 ↔ TTT←3 ↔ ARRY1←4 ↔ ARRY2←5 ↔ P←17
A←6 ↔ B←7 ↔ C←10 ↔ D←11 ↔ E←13 ↔ F←14 ↔ G←15
THIS←←TT ↔ SIZ←←TTT
WIPE: POP P,RETAD ;CLEARS A PICTURE IN PIC1
POP P,G ;VALUE
POP P,ARRY1
MOVE T,LINTAB(ARRY1) ; WIPE(PIC,VALUE)
HRL T,T
HRRZ TT,T
MOVEM G,(TT)
ADDI T,1
ADD TT,PCWD(ARRY1)
SUBI TT,1
BLT T,(TT)
JRST @RETAD
PICADD: POP P,RETAD ;ADD TWO PICTURES
POP P,ARRY2
POP P,ARRY1 ; PICADD(PIC1, PICSUM)
MOVE T,BPTAB(ARRY1)
MOVE A,-1(T)
ADD A,LINTAB(ARRY1)
MOVE T,BPTAB(ARRY2)
MOVE B,-1(T)
ADD B,LINTAB(ARRY2)
MOVE C,PCLN(ARRY1)
CAMLE C,PCLN(ARRY2)
MOVE C,PCLN(ARRY2)
MOVE D,LNBY(ARRY1)
CAMLE D,LNBY(ARRY2)
MOVE D,LNBY(ARRY2)
PLLP: MOVE E,D
MOVE F,A
MOVE G,B
PCLP: ILDB T,F
ILDB TT,G
ADD TT,T
DPB TT,G
SOJG E,PCLP
ADD A,LNWD(ARRY1)
ADD B,LNWD(ARRY2)
SOJG C,PLLP
JRST @RETAD
PICSH: POP P,RETAD ;RANGE CHANGE
POP P,TTT
POP P,ARRY2
POP P,ARRY1 ; PICSH(PIC1, PICSUM, DIV)
MOVE T,BPTAB(ARRY1)
MOVE A,-1(T)
ADD A,LINTAB(ARRY1)
MOVE T,BPTAB(ARRY2)
MOVE B,-1(T)
ADD B,LINTAB(ARRY2)
MOVE C,PCLN(ARRY1)
CAMLE C,PCLN(ARRY2)
MOVE C,PCLN(ARRY2)
MOVE D,LNBY(ARRY1)
CAMLE D,LNBY(ARRY2)
MOVE D,LNBY(ARRY2)
PSLLP: MOVE E,D
MOVE F,A
MOVE G,B
PSCLP: ILDB T,F
IDIV T,TTT
IDPB T,G
SOJG E,PSCLP
ADD A,LNWD(ARRY1)
ADD B,LNWD(ARRY2)
SOJG C,PSLLP
JRST @RETAD
TVBTMX: POP P,RETAD ;MIX A CLIPPED 4 BIT INT A MANY BIT PICTURE
POP P,T ;TOP VALUE
HRRM T,TVF
POP P,G ;XFORM TABLE
POP P,ARRY2 ;DEST ARRAY
POP P,ARRY1 ; TVBTMX(PIC1,DEST,XFRM);
HRRM G,XFT
MOVE T,BPTAB(ARRY1)
MOVE A,-1(T)
ADD A,LINTAB(ARRY1)
MOVE T,BPTAB(ARRY2)
MOVE B,-1(T)
ADD B,LINTAB(ARRY2)
MOVE C,PCLN(ARRY1)
CAMLE C,PCLN(ARRY2)
MOVE C,PCLN(ARRY2)
MOVE D,LNBY(ARRY1)
CAMLE D,LNBY(ARRY2)
MOVE D,LNBY(ARRY2)
XPLLP: MOVE E,D
MOVE F,A
MOVE G,B
XPCLP: ILDB T,F
TVF: CAIN T,7
JRST [ IBP G
SOJG E,XPCLP
ADD A,LNWD(ARRY1)
ADD B,LNWD(ARRY2)
SOJG C,XPLLP
JRST @RETAD ]
XFT: MOVE T,(T) ;CHANGED TO XFRM(T)
IDPB T,G
SOJG E,XPCLP
ADD A,LNWD(ARRY1)
ADD B,LNWD(ARRY2)
SOJG C,XPLLP
JRST @RETAD
PRGEND
TITLE GRAY
ENTRY GRAY,UNGRAY
EXTERN TEMP
I←1
J←2
K←3
T←4
M←5
AR←6
A←7
B←10
C←11
P←17
DEFINE RETAD <TEMP>
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BPTAB←12
LINTAB←←13
GRAY: POP P,RETAD ;Convert all the pixels in a picture
POP P,AR ;to Gray code representation GRAY(PICT)
MOVEI M,0
HRLZI T,400000
MOVN C,BYBI(AR)
MMH: LSH T,(C) ;MAKE A LOW ORDER BIT MASK
OR M,T
JUMPG T,MMH
MOVN I,PCWD(AR)
MOVE J,LINTAB(AR)
HRL J,I
TOGR: MOVE T,(J)
LSH T,-1
ANDCM T,M
XORM T,(J)
AOBJN J,TOGR
JRST @RETAD
UNGRAY: POP P,RETAD ;Convert all the pixels in a Gray coded picture
POP P,AR ;to binary representation UNGRAY(PICT)
MOVEI M,0
HRLZI T,400000
MOVN C,BYBI(AR)
MMHU: LSH T,(C) ;MAKE A HIGH ORDER BIT MASK
OR M,T
JUMPG T,MMHU
MOVN I,PCWD(AR)
MOVE J,LINTAB(AR)
HRL J,I
FRGR: MOVE T,(J)
UNGL: LSH T,-1
ANDCM T,M
XORM T,(J)
JUMPN T,UNGL
FRD: AOBJN J,FRGR
JRST @RETAD
PRGEND
TITLE SHRINK
ENTRY SHRINK
EXTERN CORGET,CORREL,TEMP
DEFINE RETAD <TEMP>
DEFINE XTAB <TEMP+1>
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BPTAB←←12
LINTAB←←13
T←1 ↔ TT←2 ↔ TTT←3 ↔ ARRY1←4 ↔ ARRY2←5 ↔ P←17
A←6 ↔ B←7 ↔ C←10 ↔ D←11 ↔ E←13 ↔ F←14 ↔ G←15
THIS←←TT ↔ SIZ←←TTT
SHRINK: POP P,RETAD
POP P,ARRY2
POP P,ARRY1
HRLZ T,LNBY(ARRY1) ;FIGURE HOW MANY PIXELS IN X OF ARRY1
IDIV T,LNBY(ARRY2) ;GO INTO ARRY2
MOVE SIZ,LNBY(ARRY2) ;MAKE A BPTR TABLE ENTRY FOR ARRY2
PUSHJ P,CORGET ;GET CORE FOR IT
HALT
MOVEM THIS,XTAB ;SAVE BPTR ADDRESSES
MOVN A,LNBY(ARRY2) ;SET UP COUNT
HRL THIS,A
HRLZ B,BPTAB(ARRY1) ;ADDRESS OF BPTR TABLE OF PIC1
MOVE F,T
ASH F,-1
ADD B,F
LNLP: HLRZ C,B ;GET INTEGER PART
MOVE C,(C) ;GET ITS POINTER
MOVEM C,(THIS) ;SAVE IT IN XTABLE
ADD B,T ;FIND NEXT ADDRESS
AOBJN THIS,LNLP ;AND LOOP
MOVE G,BYBI(ARRY2) ;CALCULATE RELATIVE SHIFT COUNT
SUB G,BYBI(ARRY1)
HRLZ T,PCLN(ARRY1) ;CALCULATE PARAMETERS FOR Y LOOP
IDIV T,PCLN(ARRY2)
MOVN A,PCLN(ARRY2) ;SET UP COUNT
HRLZI B,LINTAB(ARRY1) ;RAW BYTE PNTR FOR ARRY1
MOVE F,T
ASH F,-1
ADD B,F
MOVE E,BPTAB(ARRY2) ;RAW BYTE PTR FOR ARRY2
MOVE E,-1(E)
ADD E,LINTAB(ARRY2)
COLP: HLRZ D,B
MOVE D,(D) ;CORRECTED BYTE PTR FOR ARRY1
MOVE C,E ;ACTUAL BYTE PTR FOR ARRY2
MOVN TT,LNBY(ARRY2) ;INNER LOOP COUNTER ON BYTES/LINE
HRLZ TT,TT
HRR TT,XTAB
ILNP: MOVE TTT,(TT)
ADD TTT,D
LDB F,TTT
LSH F,(G)
IDPB F,C
AOBJN TT,ILNP
ADD B,T
ADD E,LNWD(ARRY2)
AOJL A,COLP
MOVE THIS,XTAB
PUSHJ P,CORREL
JRST @RETAD
PRGEND
TITLE COPPIC
EXTERN TEMP
ENTRY COPPIC
DEFINE RETAD <TEMP>
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BPTAB←←12
LINTAB←←13
T←1 ↔ TT←2 ↔ TTT←3 ↔ ARRY1←4 ↔ ARRY2←5 ↔ P←17
A←6 ↔ B←7 ↔ C←10 ↔ D←11 ↔ E←13 ↔ F←14 ↔ G←15
COPPIC: POP P,RETAD ;COPIES A PICTURE IN PIC1
POP P,ARRY2 ;INTO PIC2 (THE LINE TABLE MUST
POP P,ARRY1 ;BE ADJUSTED TO DO THIS)
HRLZ T,ARRY1 ; COPPIC(PIC1,PIC2)
HRR T,ARRY2
MOVEI TT,13(ARRY2)
ADD TT,PCLN(ARRY1)
ADD TT,LNBYA(ARRY1)
ADD TT,PCWD(ARRY1)
BLT T,(TT)
MOVE T,ARRY2
SUB T,ARRY1
MOVN TT,PCLN(ARRY1)
SUBI TT,1
HRLZ TT,TT
HRRI TT,BPTAB(ARRY2)
COPLP: ADDM T,(TT)
AOBJN TT,COPLP
JRST @RETAD
PRGEND
TITLE WIXFAI
;FULLY FORMAT 2 ORIENTED PICTURE ROUTINES. EXTENSIONS TO THE CONVERTED
;FORMAT 1 ROUTINES IN WIXSUB
ENTRY HAFPIC,GETPAR,PERBIT,HISTOG,CMPPAR,ROWSUM,ROWSUD,COLSUM
ENTRY UNPACK,SELECT
EXTERN CORGET,CORREL
EXTERN SQR,SQRL,TEMP
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BPTAB←←12
LINTAB←←13
T←1 ↔ TT←2 ↔ TTT←3 ↔ ARRY1←4 ↔ ARRY2←5 ↔ P←17
A←6 ↔ B←7 ↔ C←10 ↔ D←11 ↔ E←13 ↔ F←14 ↔ G←15
DEFINE FLOAT(N)
< FSC N,233 >
RETAD: 0
AR2TAB: MOVEI T,44 ;TOTAL BITS/WORD
IDIV T,BYBI(ARRY2) ;BYTE SIZE
MOVEM T,WDBY(ARRY2) ;BYTES PER WORD
SUBI TT,44 ;-NUMBER OF USED BITS/WORD
MOVNM TT,WDBI(ARRY2) ;SAVED
ADD T,LNBY(ARRY2)
SUBI T,1
IDIV T,WDBY(ARRY2) ;NUMBER OF WORDS/SCANLINE
MOVEM T,LNWD(ARRY2)
MOVE TT,T ;WORDS/LINE
IMUL TT,WDBY(ARRY2) ;BYTES/WORD
MOVEM TT,LNBYA(ARRY2) ;GIVES BYTES/LINE, INCLUDING NULLS
IMUL TT,PCLN(ARRY2)
MOVEM TT,PCBYA(ARRY2) ;TOTAL BYTES/PIC, INCL. NULLS
IMUL T,PCLN(ARRY2) ;LINES IN THE PICTURE
MOVEM T,PCWD(ARRY2) ;WORDS IN THE PICTURE
MOVE T,LNBY(ARRY2)
IMUL T,PCLN(ARRY2)
MOVEM T,PCBY(ARRY2) ;BYTES/PIC, NOT INCL. NULLS
MOVEI T,14(ARRY2)
ADD T,PCLN(ARRY2)
MOVEM T,BPTAB(ARRY2) ;ADDRESS OF BYTE POINTER TABLE
ADD T,LNBYA(ARRY2) ;ADDR OF FIRST WORD IN PICTURE
MOVN TT,PCLN(ARRY2) ;SET UP CNTR FOR LINE ADDRESSES
HRL TT,TT
HRRI TT,LINTAB(ARRY2)
LTLP: MOVEM T,(TT) ;MAKE LINE TABLE
ADD T,LNWD(ARRY2)
AOBJN TT,LTLP
MOVN TT,BPTAB(ARRY2)
HRL TT,LNBYA(ARRY2) ;SET UP CNTR FOR BYTE TABLE
AOBJN TT, ;DECR ADDRESS AND INCR COUNT BY 1
MOVN TT,TT
MOVEI T,4400
ADD T,BYBI(ARRY2)
LSH T,6
HRLZ T,T
BYLP: MOVEM T,(TT) ;MAKE BYTE POINTER TABLE
IBP T
AOBJN TT,BYLP
POPJ P,
HAFPIC: POP P,RETAD
POP P,G ;MAXBIT
POP P,ARRY2 ;MAKES A HALFSIZE VERSION
POP P,ARRY1 ;OF A PICTURE
MOVE T,LNBY(ARRY1) ;HAFPIC(PICIN,PICOUT,BITMAX);
ASH T,-1 ;NEW PIC IS HALF THE WIDTH
MOVEM T,LNBY(ARRY2)
MOVE T,PCLN(ARRY1)
ASH T,-1 ;AND HALF THE HEIGHT
MOVEM T,PCLN(ARRY2)
MOVE T,BYBI(ARRY1)
ADDI T,2 ;AND HAS TWO MORE BITS/PIXEL
SUB G,T ;UNLESS LIMITED TO LESS
JUMPGE G,.+2
ADD T,G
MOVEM T,BYBI(ARRY2)
PUSHJ P,AR2TAB ;SET UP ITS SKELETON
MOVE A,BPTAB(ARRY1)
MOVE A,-1(A) ;FIRST BYTE PNTR FOR ARRY1
ADD A,LINTAB(ARRY1)
MOVE B,BPTAB(ARRY2)
MOVE B,-1(B) ;AND FIRST BP FOR ARRY2
ADD B,LINTAB(ARRY2)
MOVE F,PCLN(ARRY2) ;NO OF LINES, FOR COUNT
;IF NOT NEEDED TO REDUCE BITS/BYTE
JUMPGE G,[ LNLP: MOVE TTT,LNBY(ARRY2) ;NO OF BYTES, INNER LOOP CNTR
MOVE C,A
ADD A,LNWD(ARRY1) ;BP S FOR ARRY1
MOVE D,A
ADD A,LNWD(ARRY1)
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY2)
CLLP: ILDB T,C ;FETCH FOUR BYTES AND ADD THEM
ILDB TT,C
ADD T,TT
ILDB TT,D
ADD T,TT
ILDB TT,D
ADD T,TT
IDPB T,E ;THEN DEPOSIT SUM
SOJG TTT,CLLP
SOJG F,LNLP
JRST @RETAD ]
LNLP1: MOVE TTT,LNBY(ARRY2) ;NO OF BYTES, INNER LOOP CNTR
MOVE C,A
ADD A,LNWD(ARRY1) ;BP S FOR ARRY1
MOVE D,A
ADD A,LNWD(ARRY1)
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY2)
CLLP1: ILDB T,C ;FETCH FOUR BYTES AND ADD THEM
ILDB TT,C
ADD T,TT
ILDB TT,D
ADD T,TT
ILDB TT,D
ADD T,TT
LSH T,(G) ;TRUNCATE TO CORRECT # OF BITS
IDPB T,E ;THEN DEPOSIT SUM
SOJG TTT,CLLP1
SOJG F,LNLP1
JRST @RETAD
GETPAR: POP P,RETAD
POP P,ARRY2 ;COPIES A FULL WORD ARRAY
POP P,ARRY1 ;INTO A PICTURE
MOVE B,BPTAB(ARRY2)
MOVE B,-1(B) ;AND FIRST BP FOR ARRY2
ADD B,LINTAB(ARRY2)
MOVE F,PCLN(ARRY2) ;NO OF LINES, FOR COUNT
LNLPG: MOVE TTT,LNBY(ARRY2) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY2)
CLLPG: MOVE T,(ARRY1) ;FETCH A WORD
ADDI ARRY1,1
IDPB T,E ;AND DEPOSIT A BYTE
SOJG TTT,CLLPG
SOJG F,LNLPG
JRST @RETAD
PERBIT: POP P,RETAD
POP P,ARRY2 ;transform ;TRANSFORMS EACH SAMPLE OF A
POP P,ARRY1 ;picture ;PICTURE ACCORDING TO A TABLE
HRRM ARRY2,ARF
MOVE B,BPTAB(ARRY1)
MOVE B,-1(B) ;AND FIRST BP FOR ARRY2
ADD B,LINTAB(ARRY1)
MOVE F,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPP: MOVE TTT,LNBY(ARRY1) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
CLLPP: ILDB T,E ;FETCH A SAMPLE
ARF: MOVE T,(T) ;altered to <ARRY2>(T)
DPB T,E ;AND DEPOSIT IT
SOJG TTT,CLLPP
SOJG F,LNLPP
JRST @RETAD
HISTOG: POP P,RETAD
POP P,ARRY2 ;HISTOGRAM ;MAKES A HISTOGRAM OF THE
POP P,ARRY1 ;picture ;GREY LEVELS IN A PICTURE
HRRM ARRY2,ARFG
HRRM ARRY2,ARFH
MOVEI A,1
LSH A,@BYBI(ARRY1)
SUBI A,1
ARFH: SETZM (A) ;CLEAR THE ARRAY
SOJGE A,ARFH
MOVE B,BPTAB(ARRY1)
MOVE B,-1(B) ;AND FIRST BP FOR ARRY2
ADD B,LINTAB(ARRY1)
MOVE F,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPH: MOVE TTT,LNBY(ARRY1) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
CLLPH: ILDB T,E ;FETCH A SAMPLE
ARFG: AOS (T) ;altered to <ARRY2>(T)
SOJG TTT,CLLPH
SOJG F,LNLPH
JRST @RETAD
COLSUM: POP P,RETAD
POP P,ARRY2 ;COL SUMS ;calculates the sum of each col of a pict
POP P,ARRY1 ;picture
MOVN TTT,LNBY(ARRY1)
HRL ARRY2,TTT
MOVE B,BPTAB(ARRY1)
MOVE B,-1(B) ;FIRST BP FOR ARRY1
ADD B,LINTAB(ARRY1)
MOVE TTT,ARRY2
CCCL: SETZM (TTT) ;CLEAR COL SUM ARRY
AOBJN TTT,CCCL
MOVE F,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPSC: MOVE TTT,ARRY2 ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
CLLPSC: ILDB T,E ;FETCH A SAMPLE
ADDM T,(TTT) ;ADD IT TO SUM ENTRY
AOBJN TTT,CLLPSC
SOJG F,LNLPSC
JRST @RETAD
ROWSUM: POP P,RETAD
POP P,ARRY2 ;ROW SUMS ;calculates the sum of each row of a pict
POP P,ARRY1 ;picture
HRRM ARRY2,ARFS
MOVE B,BPTAB(ARRY1)
MOVE B,-1(B) ;AND FIRST BP FOR ARRY2
ADD B,LINTAB(ARRY1)
MOVE F,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPS: MOVE TTT,LNBY(ARRY1) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
SETZM @ARFS
CLLPS: ILDB T,E ;FETCH A SAMPLE
ARFS: ADDM T,0 ;altered to <ARRY2>(TTT)
SOJG TTT,CLLPS
AOS ARFS
SOJG F,LNLPS
JRST @RETAD
UNPACK: POP P,RETAD ; UNPACK A DENSE BYTE ARRAY INTO A PICTURE
POP P,ARRY1 ;destination picture
POP P,ARRY2 ;original packed array
MOVE C,BPTAB(ARRY1)
ADD ARRY2,-1(C) ;construct byte pntr for source array
MOVE B,BPTAB(ARRY1)
MOVE B,-1(B) ;AND FIRST BP FOR destination
ADD B,LINTAB(ARRY1)
MOVE F,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPU: MOVE TTT,LNBY(ARRY1) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
CLLPU: ILDB T,C
IDPB T,E ;MOVE A SAMPLE
SOJG TTT,CLLPU
SOJG F,LNLPU
JRST @RETAD
SELECT: POP P,RETAD ;copy a piece of a picture into another
POP P,ARRY2 ;destination picture
POP P,B ;XEDGE
POP P,A ;YEDGE
POP P,ARRY1 ;source picture, part of which is to be copied
ADD B,BPTAB(ARRY1) ;SYNTHESIZE BYTE POINTER
MOVE B,-1(B) ;FOR SOURCE ARRAY
ADDI A,LINTAB(ARRY1)
ADD B,(A)
MOVE A,BPTAB(ARRY2)
MOVE A,-1(A) ;AND FIRST BP FOR destination
ADD A,LINTAB(ARRY2)
MOVE D,BYBI(ARRY2)
SUB D,BYBI(ARRY1)
MOVE F,PCLN(ARRY2) ;NO OF LINES, FOR COUNT
LNLPL: MOVE TTT,LNBY(ARRY2) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
MOVE C,A
ADD A,LNWD(ARRY2)
CLLPL: ILDB T,E
LSH T,(D)
IDPB T,C ;MOVE A SAMPLE
SOJG TTT,CLLPL
SOJG F,LNLPL
JRST @RETAD
ROWSUD: POP P,RETAD ;much quicker and dirtier than ROWSUM
POP P,ARRY2 ;ROW SUMS ;roughly calculates row sums
POP P,ARRY1 ;picture
SUBI ARRY2,1
MOVN B,LNWD(ARRY1)
MOVE TTT,LINTAB(ARRY1)
MOVE F,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPD: HRL TTT,B ;NO OF WORDS, INNER LOOP CNTR
MOVEI TT,0
CLLPD: HLRZ T,(TTT) ;FETCH A SAMPLE, SORT OF
ADD TT,T
AOBJN TTT,CLLPD
PUSH ARRY2,TT
SOJG F,LNLPD
JRST @RETAD
DEFINE SHFT1 <TEMP+1>
CMPPAR: POP P,RETAD
POP P,ARRY2 ;picture y ;compares two pictures
POP P,ARRY1 ;picture x ;sigma(xi-yi)↑2/n
MOVE B,BPTAB(ARRY1)
MOVE B,-1(B) ;FIRST BP FOR ARRY1
ADD B,LINTAB(ARRY1)
MOVE C,BPTAB(ARRY2)
MOVE C,-1(C) ;AND FIRST BP FOR ARRY2
ADD C,LINTAB(ARRY2)
MOVEI T,7 ;CALCULATE NORMALIZATION SHIFT
SUB T,BYBI(ARRY1) ;FOR MAKING SAMPLES 7 BITS
HRRZM T,SHFT1 ;USING FIRST PICTURE
MOVEI A,0 ;INITIALIZE SUM
MOVE G,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPC: MOVE TTT,LNBY(ARRY1) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
MOVE F,C
ADD C,LNWD(ARRY2)
CLLPC: ILDB T,E ;FETCH A SAMPLE
ILDB TT,F
SUB T,TT
ASH T,@SHFT1
ADD A,SQR(T) ;and add (xi-yi)↑2 to A
SOJG TTT,CLLPC
SOJG G,LNLPC
FLOAT (A)
MOVE B,PCBY(ARRY1)
FLOAT (B)
FDVR A,B
MOVE 1,A
JRST @RETAD
PRGEND
TITLE CENTRO
;FIND THE CENTRIOD OF BLACK AREA IN A PICTURE WINDOW
ENTRY CENTRO
EXTERN SQR,SQRL,TEMP
DEFINE FLOAT(N)
< FSC N,233 >
OPDEF FIX[247000233000]
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BPTAB←←12
LINTAB←←13
TTT←1 ↔ TT←2 ↔ T←3 ↔ ARRY1←4 ↔ TRES←5 ↔ P←17
X2←6 ↔ X1←7 ↔ Y2←10 ↔ Y1←11 ↔ E←13 ↔ F←14 ↔ G←15
DEFINE RETAD <TEMP>
DEFINE X2A <TEMP+2>
DEFINE Y2A <TEMP+3>
DEFINE X1A <TEMP+4>
DEFINE Y1A <TEMP+5>
CENTRO: POP P,RETAD ;find centroid of black area in a window
POP P,TRES ;threshold
POP P,X2A ; #BLACK ← CENTRO(PIC,Y1,X1,Y2,X2,THRESH)
POP P,Y2A ; CENTROID POSITION RETURNED
POP P,X1A ; Y1, X1
POP P,Y1A
POP P,ARRY1 ;source picture
MOVE X1,@X1A
FIX X1,
MOVE Y1,@Y1A
FIX Y1,
MOVE X2,@X2A
FIX X2,
MOVE Y2,@Y2A
FIX Y2,
SETZM @X2A
SETZM @Y2A
SETZ TTT,
CAMLE X1,X2 ;FIX UP LIMITS
EXCH X1,X2
CAMLE Y1,Y2
EXCH Y1,Y2
CAIL X2,0
CAML X1,LNBY(ARRY1)
JRST GUPP
CAIL Y2,0
CAML Y1,PCLN(ARRY1)
JRST GUPP
CAIGE X1,0
MOVEI X1,0
MOVE T,LNBY(ARRY1)
CAML X2,T
MOVEI X2,-1(T)
CAIGE Y1,0
MOVEI Y1,0
MOVE T,PCLN(ARRY1)
CAML Y2,T
MOVEI Y2,-1(T)
SUBM Y1,Y2 ;NO OF LINES, FOR COUNT
HRL Y1,Y2
SUBM X1,X2 ;NO OF COLUMNS
HRL X1,X2
MOVE E,BPTAB(ARRY1) ;GENERATE INITIAL BYTE PNTR
ADDI E,-1(X1)
MOVE E,(E)
HRRZ T,Y1
ADD T,ARRY1
ADD E,LINTAB(T)
SETZB X2,Y2 ;POSITION REGS
SETZ TT, ;HIT COUNT
LNLPCE: MOVE F,E ;NO OF BYTES, INNER LOOP CNTR
MOVE G,X1
CLLPCE: ILDB T,F
CAML T,TRES
JRST NOTBL
MOVEI T,(G)
IMUL T,T
ADDM T,@X2A
MOVEI T,(Y1)
IMUL T,T
ADDM T,@Y2A
ADDI X2,(G) ;REGISTER A BLACK SAMPLE
ADDI Y2,(Y1)
ADDI TT,1
NOTBL: AOBJN G,CLLPCE
ADD E,LNWD(ARRY1)
AOBJN Y1,LNLPCE
JUMPE TT,GUPP
FLOAT(TT)
FLOAT(Y2)
FLOAT(X2)
FDVR Y2,TT
MOVEM Y2,@Y1A
FDVR X2,TT
MOVEM X2,@X1A
MOVE TTT,@X2A
FLOAT(TTT)
FDVR TTT,TT
FMPR X2,X2
FSBR TTT,X2
MOVEM TTT,@X2A
MOVE TTT,@Y2A
FLOAT(TTT)
FDVR TTT,TT
FMPR Y2,Y2
FSBR TTT,Y2
MOVEM TTT,@Y2A
MOVE TTT,TT
FIX TTT,
GUPP: JRST @RETAD
PRGEND
TITLE INTOP
EXTERN TEMP,SQR,SQRL,CORGET,CORREL
ENTRY INTOP,INTLOM
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BPTAB←12
LINTAB←←13
VW←0
POS←1
CNT1←2 ↔ THIS←2
CNT2←3 ↔ SIZ←3
ARRY←4
ARRYO←5
PNT←6
CNT←7
D1C←10
D2C←11
T←13
HC←14
VC←15
P←17
DEFINE RETAD <TEMP>
DEFINE VERWIN <TEMP+1>
DEFINE HORWIN <TEMP+2>
DEFINE STRP <TEMP+3>
DEFINE WIND <TEMP+4>
DEFINE TOP <TEMP+5>
DEFINE SUM <TEMP+6>
DEFINE NWIN <TEMP+7>
DEFINE XIN <TEMP+10>
DEFINE YIN <TEMP+11>
INTOP: POP P,RETAD ; INTOP(PIC,WINDOWSIZE,RESULTARRAY)
POP P,XIN
POP P,YIN
POP P,ARRYO ; INTEREST OPERATOR, NO LOCAL
POP P,WIND ; MAXIMUM TEST
POP P,ARRY
MOVE 1,LNBY(ARRY)
SUBI 1,1
SUB 1,XIN
IDIV 1,WIND
MOVEM 1,HORWIN
MOVE 1,PCLN(ARRY)
SUB 1,YIN
SUBI 1,1
IDIV 1,WIND
MOVEM 1,VERWIN
IMUL 1,HORWIN
MOVEM 1,NWIN
MOVE PNT,BPTAB(ARRY)
MOVE PNT,-1(PNT)
MOVE T,ARRY
ADD T,YIN
ADD PNT,LINTAB(T)
MOVE SIZ,WIND
ADDI SIZ,1
IMUL SIZ,LNBYA(ARRY)
MOVN T,SIZ
HRLZM T,STRP
PUSHJ 17,CORGET
HALT
HRRM THIS,PQ1
HRRM THIS,ILP
HRRM THIS,PQ2
HRRM THIS,PQ3
ADDI THIS,1
HRRM THIS,PR1
HRRM THIS,PR2
ADD THIS,LNBYA(ARRY)
HRRM THIS,PP1
SUBI THIS,1
HRRM THIS,PP
HRRM THIS,PP0
MOVEI T,5 ;CALCULATE SHIFT NEEDED TO MAKE SAMPLE SIZE
SUB T,BYBI(ARRY) ;FIVE BITS
HRRM T,SHFT1
SUBI ARRYO,1
MOVE VW,VERWIN
SETZM SUM
VERLP: MOVE CNT,STRP
UNPAK: ILDB T,PNT
SHFT1: LSH T,0
PQ1: MOVEM T,(CNT)
AOBJN CNT,UNPAK
MOVE CNT,HORWIN
MOVE POS,XIN
MOVEM POS,TOP
KLP: SETZB HC,VC
SETZB D1C,D2C
MOVE CNT2,WIND
JLP: MOVE CNT1,WIND
ILP: MOVE T,(POS)
PR1: SUB T,(POS)
ADD HC,SQR(T)
PQ2: MOVE T,(POS)
PP: SUB T,(POS) ;REPLACED BY STRIP+<PICWID>(POS)
ADD VC,SQR(T)
PQ3: MOVE T,(POS)
PP1: SUB T,(POS) ;REPLACED BY STRIP +<PICWID>+1
ADD D1C,SQR(T)
PR2: MOVE T,(POS)
PP0: SUB T,(POS) ;REPLACED BY STRIP+<PICWID>-1
ADD D2C,SQR(T)
ADD POS,LNBYA(ARRY)
SOJG CNT1,ILP
AOS POS,TOP
SOJG CNT2,JLP
CAMLE HC,VC
MOVE HC,VC
CAMLE HC,D1C
MOVE HC,D1C
CAMLE HC,D2C
MOVE HC,D2C
LSH HC,1
ORI HC,1
ADDM HC,SUM
PUSH ARRYO,HC
SOJG CNT,KLP
SUB PNT,LNWD(ARRY)
SOJG VW,VERLP
HRRZ THIS,PQ1
PUSHJ 17,CORREL
MOVE 1,SUM
IDIV 1,NWIN
JRST @RETAD
; INTLOM(VER,HOR,ARRY) ;INTEREST OPERATOR LOCAL MXIMUM TEST
VER←1 ↔ HOR←2 ↔ CNT←3 ↔ T←4 ↔ PEL←5
INTLOM: POP P,RETAD ;INTEREST OPERATOR LOCAL MAXIMUM TEST
POP P,CNT
POP P,HOR
POP P,VER
MOVEI T,-2(VER) ;CALCULATE NUMBER OF WORDS THAT CAN BE DONE
IMUL T,HOR
SUBI T,2
MOVN T,T
HRL CNT,T
MOVE T,HOR ;FIXUP THE OFFSET ARRAY REFERENCES
HRRM T,A10
HRRM T,A10+2
HRRM T,B10
HRRM T,B10+1
HRRM T,C10
HRRM T,C10+2
HRRM T,D10
HRRM T,D10+1
HRRM T,E10
HRRM T,E10+2
HRRM T,F10
HRRM T,F10+1
MOVE T,HOR
LSH T,1
HRRM T,A20
HRRM T,A20+2
HRRM T,B20
HRRM T,B20+1
HRRM T,C20
HRRM T,C20+2
HRRM T,D20
HRRM T,D20+1
HRRM T,E20
HRRM T,E20+2
HRRM T,F20
HRRM T,F20+1
MOVE T,HOR
ADDI T,1
HRRM T,A11
HRRM T,A11+2
HRRM T,B11
HRRM T,B11+1
MOVE T,HOR
ADDI T,2
HRRM T,A12
HRRM T,A12+2
HRRM T,B12
HRRM T,B12+1
MOVE T,HOR
LSH T,1
ADDI T,1
HRRM T,A21
HRRM T,A21+2
HRRM T,B21
HRRM T,B21+1
MOVE T,HOR
LSH T,1
ADDI T,2
HRRM T,A22
HRRM T,A22+2
HRRM T,B22
HRRM T,B22+1
MOVEI T,1
GOLL: MOVE PEL,(CNT) ;BEGIN THE LOOP
TRNN PEL,1 ;COMPARISONS INVOLVING UPPER LEFT ELEMENT
JRST B01
A01: CAMGE PEL,1(CNT)
SOJA PEL,B02
ANDCAM T,1(CNT)
A02: CAMGE PEL,2(CNT)
SOJA PEL,B10
ANDCAM T,2(CNT)
A10: CAMGE PEL,(CNT)
SOJA PEL,B20
ANDCAM T,(CNT)
A20: CAMGE PEL,(CNT)
SOJA PEL,B11
ANDCAM T,(CNT)
A11: CAMGE PEL,1(CNT)
SOJA PEL,B12
ANDCAM T,1(CNT)
A12: CAMGE PEL,1(CNT)
SOJA PEL,B21
ANDCAM T,1(CNT)
A21: CAMGE PEL,1(CNT)
SOJA PEL,B22
ANDCAM T,1(CNT)
A22: CAMGE PEL,1(CNT)
SOJA PEL,LDN
ANDCAM T,1(CNT)
JRST LDN
B01: CAMLE PEL,1(CNT)
ANDCAM T,1(CNT)
B02: CAMLE PEL,2(CNT)
ANDCAM T,2(CNT)
B10: CAMLE PEL,(CNT)
ANDCAM T,(CNT)
B20: CAMLE PEL,(CNT)
ANDCAM T,(CNT)
B11: CAMLE PEL,1(CNT)
ANDCAM T,1(CNT)
B12: CAMLE PEL,2(CNT)
ANDCAM T,2(CNT)
B21: CAMLE PEL,1(CNT)
ANDCAM T,1(CNT)
B22: CAMLE PEL,2(CNT)
ANDCAM T,2(CNT)
LDN: MOVEM PEL,(CNT)
MOVE PEL,1(CNT) ;UPPER SECOND ELEMENT
TRNN PEL,1
JRST D10
C10: CAMGE PEL,(CNT)
SOJA PEL,D20
ANDCAM T,(CNT)
C20: CAMGE PEL,(CNT)
SOJA PEL,MDN
ANDCAM T,(CNT)
JRST MDN
D10: CAMLE PEL,(CNT)
ANDCAM T,(CNT)
D20: CAMLE PEL,(CNT)
ANDCAM T,(CNT)
MDN: MOVEM PEL,1(CNT)
MOVE PEL,2(CNT) ;UPPER RIGHT ELEMENT
TRNN PEL,1
JRST F10
E10: CAMGE PEL,(CNT)
SOJA PEL,F20
ANDCAM T,(CNT)
E20: CAMGE PEL,(CNT)
SOJA PEL,ODN
ANDCAM T,(CNT)
JRST ODN
F10: CAMLE PEL,(CNT)
ANDCAM T,(CNT)
F20: CAMLE PEL,(CNT)
ANDCAM T,(CNT)
ODN: MOVEM PEL,2(CNT)
AOBJN CNT,GOLL
JRST @RETAD
PRGEND
TITLE MATCH
ENTRY MATCH
EXTERN SQR,SQRL,CORGET,CORREL
EXTERN TEMP
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BPTAB←←12
LINTAB←←13
T←1 ↔ TT←2 ↔ TTT←3 ↔ ARRY1←4 ↔ ARRY2←5 ↔ P←17
A←6 ↔ B←7 ↔ C←10 ↔ D←11 ↔ E←13 ↔ F←14 ↔ G←15
X1←←A ↔ Y1←←B ↔ X2←←C ↔ Y2←←D
DEFINE AX1 <TEMP>
DEFINE AY1 <TEMP+1>
DEFINE AX2 <TEMP+2>
DEFINE AY2 <TEMP+3>
DEFINE BX1 <TEMP+4>
DEFINE BY1 <TEMP+5>
DEFINE BX2 <TEMP+6>
DEFINE BY2 <TEMP+7>
DEFINE SOUWIN <TEMP+10>
DEFINE DESWIN <TEMP+11>
DEFINE DEXSKP <TEMP+12>
DEFINE DEYSKP <TEMP+13>
DEFINE WSIZ1 <TEMP+14>
DEFINE DWSIZ <TEMP+15>
DEFINE WSIZY1 <TEMP+16>
DEFINE VARIAN <TEMP+17>
DEFINE SOUSIZ <TEMP+20>
DEFINE WSIZ <TEMP+21>
DEFINE DWSIZ <TEMP+22>
DEFINE SHFT1 <TEMP+23>
DEFINE SHFT2 <TEMP+24>
DEFINE RETAD <TEMP+25>
MATCH: POP P,RETAD
POP P,BX2 ;A CORRELATOR. FINDS THE BEST MATCH
POP P,BY2 ;TO RECTANGLE ARRY1(AX1:AX2,AY1:AY2)
POP P,BX1 ;IN ARRY2(BX1:BY1,BX2:BY2)
POP P,BY1 ;ALL ARGUMENT ARE BY REFERENCE. THE
POP P,ARRY2 ;A'S AND B'S MAY BE ADJUSTED TO MAKE
MOVE X1,@BX1 ;THINGS FIT
MOVE X2,@BX2 ; MATCH(PIC1,AX1,AY1,AX2,AY2,
MOVE Y1,@BY1 ; PIC2,BX1,BY1,BX2,BY2);
MOVE Y2,@BY2
FIXB: CAMLE X1,X2 ;FIRST FIX UP THE LIMITS SO
EXCH X1,X2 ;X1≤X2, X1≥0 X2<WIDTH ETC.
CAIGE X1,0
MOVEI X1,0
MOVE T,LNBY(ARRY2)
CAML X2,T
MOVEI X2,-1(T)
CAMLE Y1,Y2 ;SIMILAR FOR Y
EXCH Y1,Y2
CAIGE Y1,0
MOVEI Y1,0
MOVE T,PCLN(ARRY2)
CAML Y2,T
MOVEI Y2,-1(T)
CAMG X1,X2
CAMLE Y1,Y2
JRST FIXB
MOVEM X1,@BX1
MOVEM X2,@BX2
MOVEM Y1,@BY1
MOVEM Y2,@BY2
POP P,AX2 ;DO SAME FOR SOURCE WINDOW
POP P,AY2
POP P,AX1
POP P,AY1
POP P,ARRY1
MOVE X1,@AX1
MOVE X2,@AX2
MOVE Y1,@AY1
MOVE Y2,@AY2
MOVEI T,5 ;CALCULATE SHIFTS NEEDED TO
SUB T,BYBI(ARRY1) ;CHANGE BOTH WINDOWS TO
HRRZM T,SHFT1 ;FIVE BITS/SAMPLE (TO FIT THE SQUARES
MOVEI T,5 ;TABLE)
SUB T,BYBI(ARRY2)
HRRZM T,SHFT2
FIXA: CAMLE X1,X2 ;FIRST FIX UP THE LIMITS SO
EXCH X1,X2 ;X1≤X2, X1≥0 X2<WIDTH ETC.
CAIGE X1,0
MOVEI X1,0
MOVE T,LNBY(ARRY1)
CAML X2,T
MOVEI X2,-1(T)
CAMLE Y1,Y2 ;SIMILAR FOR Y
EXCH Y1,Y2
CAIGE Y1,0
MOVEI Y1,0
MOVE T,PCLN(ARRY1)
CAML Y2,T
MOVEI Y2,-1(T)
CAMG X1,X2
CAMLE Y1,Y2
JRST FIXA
MOVE T,@BX1 ;SHRINK SOURCE WINDOW SYMMETRICALLY
SUB T,@BX2 ;UNTIL IT IS NO
ADD T,X2 ;LARGER THAN DESTINATION WINDOW
SUB T,X1
JUMPLE T,YSHRNK
MOVEI TT,1(T)
ASHC T,-1
ADDI X1,(T)
SUBI X2,(TT)
YSHRNK: MOVE T,@BY1 ;SHRINK IN Y DIRECTION
SUB T,@BY2 ;UNTIL IT IS NO
ADD T,Y2 ;LARGER THAN DESTINATION WINDOW
SUB T,Y1
JUMPLE T,RESTA
MOVEI TT,1(T)
ASHC T,-1
ADDI Y1,(T)
SUBI Y2,(TT)
RESTA: MOVEM X1,@AX1
MOVEM Y1,@AY1
MOVEM X2,@AX2
MOVEM Y2,@AY2
THIS←←TT ↔ SIZ←←TTT
MOVEI SIZ,1(X2) ;CALCULATE SIZE OF BUFFER AREA
SUB SIZ,X1 ;FOR THE SOURCE WINDOW CODE
MOVEM SIZ,WSIZ1 ;WILL BE X WINDOWSIZE-1
MOVEM SIZ,WSIZ ;IS X WINDOWSIZ
MOVNM SIZ,DEXSKP ;WILL BE DELTA XB - DELTA XA
MOVEI T,1(Y2)
SUB T,Y1
MOVEM T,WSIZY1 ;WILL BE X WINDOWSIZE-1
MOVNM T,DEYSKP ;WIL BE DELTA YB - DELTA YA
IMUL SIZ,T
MOVEM SIZ,SOUSIZ ;SOURCE WINDOW SIZE (IN PIXELS)
ASH SIZ,1
ADDI SIZ,1
PUSHJ P,CORGET ;AND MAKE THAT BUFFER
HALT
MOVEM THIS,SOUWIN
SUBI THIS,1
MOVN T,T
HRLZ T,T
HRRI T,LINTAB(ARRY1) ;Y COUNTER
ADD T,Y1
MOVE 0,@BX2 ;FINISH UP MAKING DELTA XB -DELTA XA
SUB 0,@BX1
ADDI 0,1
MOVEM 0,DWSIZ
ADDM 0,DEXSKP
MOVE 0,@BY2 ;AND THE Y'S TOO
SUB 0,@BY1
ADDI 0,1
ADDM 0,DEYSKP
SOS WSIZ1 ;NOT TO MENTION X WINDOWSIZ-1
SOS WSIZY1 ;AND Y WINDOWSIZ-1
MOVE G,[MOVN TT,0(T)]
MOVE E,BPTAB(ARRY1) ;BP SKELETON
ADDI E,-1(X1)
MOVE E,(E)
SETZB B,A ;FOR SUM OF X AND X↑2, AS EXPLND BELOW
;DON'T FORGET! A,B,C,D ARE X1,X2,Y1,Y2 ALSO
ILYLP: MOVE F,E ;SETS UP IN LINE CODED
ADD F,(T) ;STUFF FOR THE INNER
MOVE TTT,WSIZ ;"LOOP" OF THE CORRELATION
ILXLP: PUSH THIS,G ;A SEQUENCE OF
ADDI G,1 ; MOVN TT,POSB(T)
ILDB C,F ; ADD A,SQR+PIXEL(TT)
LSH C,@SHFT1
ADD B,C
ADD A,SQR(C)
ADD C,[ADD A,SQR(TT)]
PUSH THIS,C
SOJG TTT,ILXLP
ADD G,DEXSKP
AOBJN T,ILYLP
PUSH THIS,[JRST INRDON] ;AND THE FINAL INSTR.
;CALCULATE SUM[(X-XBAR)↑2] ALSO. THIS IS SAME AS SUM[X↑2-2 X XBAR+XBAR↑2],
;WHICH IS SUM[X↑2]-2 XBAR SUM[X]+XBAR↑2*N OR, SINCE XBAR=SUM[X]/N,
;SUM[X↑2]-2(SUM[X])↑2/N+(SUM[X])↑2/N WHICH IS SUM[X↑2]-(SUM[X])↑2/N
; THIS QUANTITY WILL BE CALLED VARIANCE
IMUL B,B
IDIV B,SOUSIZ
SUB A,B
MOVEM A,VARIAN
MOVE X1,@BX1 ;MAKE THE DESTINATION
MOVE X2,@BX2 ;WINDOW BUFFER
MOVE Y1,@BY1
MOVE Y2,@BY2
MOVEI SIZ,1(X2)
SUB SIZ,X1
MOVEM SIZ,DWSIZ
MOVEI T,1(Y2)
SUB T,Y1
IMUL SIZ,T
PUSHJ P,CORGET
HALT
MOVEM THIS,DESWIN
SUBI THIS,1
MOVN T,T ;Y COUNTER
HRLZ T,T
HRRI T,LINTAB(ARRY2)
ADD T,Y1
MOVE E,BPTAB(ARRY2) ;BYTE POINTER SKELETON
ADDI E,-1(X1) ;FOR DESTINATION
MOVE E,(E)
BUYLP: MOVE F,E ;UNPACKS THE DESTINATION
ADD F,(T) ;WINDOW, ONE WORD/SAMPLE
MOVE TTT,DWSIZ
BUXLP: ILDB 0,F
LSH 0,@SHFT2
PUSH THIS,0
SOJG TTT,BUXLP
AOBJN T,BUYLP
MOVN B,DEXSKP ;NOW ACTUALLY CORRELATE
SUBI B,1
HRLZI D,377777 ;VALUE OF BEST MATCH IN D
MOVE E,DESWIN ;LOCATION IN E
MOVE C,DEYSKP ;NUMBER OF ROWS
MOVE T,DESWIN ;WHERE TO START
CRYLP: HRL T,B ;INIT X CNTR, BUT KEEP OLD POSN
CRXLP: MOVEI A,0 ;ACCUMULATE CURRENT SUM IN A
JRST @SOUWIN ;JUMP TO PREVIOUSLY CREATED CODE
INRDON: CAML A,D ;SEE IF NEW SUM IS BETTER
JRST .+3
MOVE D,A ;IF SO, RECORD IT
HRRZ E,T
AOBJN T,CRXLP ;SHIFT IN X, AND TRY AGAIN
ADD T,WSIZ1 ;ADD WHATS NEEDED TO GET TO NEXT
SOJGE C,CRYLP ;SCANLINE, AND TRY AGAIN
SUB E,DESWIN ;DECOMPOSE SAVED BEST LOCATION
IDIV E,DWSIZ ;INTO X AND Y PARTS
ADDB E,@BY1 ;ACTUAL LOWER Y BOUND OF BEST MATCH
ADDB F,@BX1 ;ACTUAL LOWER X BOUND OF BEST MATCH
ADD F,WSIZ1 ;COMPUTE UPPER X BOUND
MOVEM F,@BX2 ;AND RETURN IT
ADD E,WSIZY1 ;UPPER Y BOUND
MOVEM E,@BY2 ;RETURNED
MOVE THIS,SOUWIN ;RETURN THE USED CORAGE
PUSHJ P,CORREL
MOVE THIS,DESWIN
PUSHJ P,CORREL
MOVE 1,D ;GET READY TO RETURN VALUE OF MATCH
ASH 1,4 ;SCALE IT UP BY 2↑4
IDIV 1,VARIAN ;NORMALIZE
JRST @RETAD ;AND RETURN
PRGEND
TITLE NORCOR
ENTRY NORCOR
EXTERN SQR,SQRL,CORGET,CORREL
EXTERN TEMP
DEFINE FLOAT(N)
< FSC N,233 >
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BPTAB←←12
LINTAB←←13
T←1 ↔ TT←2 ↔ TTT←3 ↔ ARRY1←4 ↔ ARRY2←5 ↔ P←17
A←6 ↔ B←7 ↔ C←10 ↔ D←11 ↔ E←13 ↔ F←14 ↔ G←15
X1←←A ↔ Y1←←B ↔ X2←←C ↔ Y2←←D
DEFINE AX1 <TEMP>
DEFINE AY1 <TEMP+1>
DEFINE AX2 <TEMP+2>
DEFINE AY2 <TEMP+3>
DEFINE BX1 <TEMP+4>
DEFINE BY1 <TEMP+5>
DEFINE BX2 <TEMP+6>
DEFINE BY2 <TEMP+7>
DEFINE SOUWIN <TEMP+10>
DEFINE DESWIN <TEMP+11>
DEFINE DEXSKP <TEMP+12>
DEFINE DEYSKP <TEMP+13>
DEFINE WSIZ1 <TEMP+14>
DEFINE DWSIZ <TEMP+15>
DEFINE WSIZY1 <TEMP+16>
DEFINE SIGX <TEMP+17>
DEFINE SOUSIZ <TEMP+20>
DEFINE WSIZ <TEMP+21>
DEFINE DWSIZ <TEMP+22>
DEFINE SHFT1 <TEMP+23>
DEFINE SHFT2 <TEMP+24>
DEFINE SIGXX <TEMP+25>
DEFINE RETAD <TEMP+26>
DEFINE SSIGX <TEMP+27>
NORCOR: POP P,RETAD
POP P,BX2 ;A CORRELATOR. FINDS THE BEST MATCH
POP P,BY2 ;TO RECTANGLE ARRY1(AX1:AX2,AY1:AY2)
POP P,BX1 ;IN ARRY2(BX1:BY1,BX2:BY2)
POP P,BY1 ;ALL ARGUMENT ARE BY REFERENCE. THE
POP P,ARRY2 ;A'S AND B'S MAY BE ADJUSTED TO MAKE
MOVE X1,@BX1 ;THINGS FIT
MOVE X2,@BX2 ; NORCOR(PIC1,AX1,AY1,AX2,AY2,
MOVE Y1,@BY1 ; PIC2,BX1,BY1,BX2,BY2);
MOVE Y2,@BY2
FIXB: CAMLE X1,X2 ;FIRST FIX UP THE LIMITS SO
EXCH X1,X2 ;X1≤X2, X1≥0 X2<WIDTH ETC.
CAIGE X1,0
MOVEI X1,0
MOVE T,LNBY(ARRY2)
CAML X2,T
MOVEI X2,-1(T)
CAMLE Y1,Y2 ;SIMILAR FOR Y
EXCH Y1,Y2
CAIGE Y1,0
MOVEI Y1,0
MOVE T,PCLN(ARRY2)
CAML Y2,T
MOVEI Y2,-1(T)
CAMG X1,X2
CAMLE Y1,Y2
JRST FIXB
MOVEM X1,@BX1
MOVEM X2,@BX2
MOVEM Y1,@BY1
MOVEM Y2,@BY2
POP P,AX2 ;DO SAME FOR SOURCE WINDOW
POP P,AY2
POP P,AX1
POP P,AY1
POP P,ARRY1
MOVE X1,@AX1
MOVE X2,@AX2
MOVE Y1,@AY1
MOVE Y2,@AY2
MOVEI T,5 ;CALCULATE SHIFTS NEEDED TO
SUB T,BYBI(ARRY1) ;CHANGE BOTH WINDOWS TO
HRRZM T,SHFT1 ;FIVE BITS/SAMPLE (TO FIT THE SQUARES
MOVEI T,5 ;TABLE)
SUB T,BYBI(ARRY2)
HRRZM T,SHFT2
FIXA: CAMLE X1,X2 ;FIRST FIX UP THE LIMITS SO
EXCH X1,X2 ;X1≤X2, X1≥0 X2<WIDTH ETC.
CAIGE X1,0
MOVEI X1,0
MOVE T,LNBY(ARRY1)
CAML X2,T
MOVEI X2,-1(T)
CAMLE Y1,Y2 ;SIMILAR FOR Y
EXCH Y1,Y2
CAIGE Y1,0
MOVEI Y1,0
MOVE T,PCLN(ARRY1)
CAML Y2,T
MOVEI Y2,-1(T)
CAMG X1,X2
CAMLE Y1,Y2
JRST FIXA
MOVE T,@BX1 ;SHRINK SOURCE WINDOW SYMMETRICALLY
SUB T,@BX2 ;UNTIL IT IS NO
ADD T,X2 ;LARGER THAN DESTINATION WINDOW
SUB T,X1
JUMPLE T,YSHRNK
MOVEI TT,1(T)
ASHC T,-1
ADDI X1,(T)
SUBI X2,(TT)
YSHRNK: MOVE T,@BY1 ;SHRINK IN Y DIRECTION
SUB T,@BY2 ;UNTIL IT IS NO
ADD T,Y2 ;LARGER THAN DESTINATION WINDOW
SUB T,Y1
JUMPLE T,RESTA
MOVEI TT,1(T)
ASHC T,-1
ADDI Y1,(T)
SUBI Y2,(TT)
RESTA: MOVEM X1,@AX1
MOVEM Y1,@AY1
MOVEM X2,@AX2
MOVEM Y2,@AY2
THIS←←TT ↔ SIZ←←TTT
MOVEI SIZ,1(X2) ;CALCULATE SIZE OF BUFFER AREA
SUB SIZ,X1 ;FOR THE SOURCE WINDOW CODE
MOVEM SIZ,WSIZ1 ;WILL BE X WINDOWSIZE-1
MOVEM SIZ,WSIZ ;IS X WINDOWSIZ
MOVNM SIZ,DEXSKP ;WILL BE DELTA XB - DELTA XA
MOVEI T,1(Y2)
SUB T,Y1
MOVEM T,WSIZY1 ;WILL BE X WINDOWSIZE-1
MOVNM T,DEYSKP ;WIL BE DELTA YB - DELTA YA
IMUL SIZ,T
MOVEM SIZ,SOUSIZ ;SOURCE WINDOW SIZE (IN PIXELS)
IMULI SIZ,3
ADDI SIZ,1
PUSHJ P,CORGET ;AND MAKE THAT BUFFER
HALT
MOVEM THIS,SOUWIN
SUBI THIS,1
MOVN T,T
HRLZ T,T
HRRI T,LINTAB(ARRY1) ;Y COUNTER
ADD T,Y1
MOVE 0,@BX2 ;FINISH UP MAKING DELTA XB -DELTA XA
SUB 0,@BX1
ADDI 0,1
MOVEM 0,DWSIZ
ADDM 0,DEXSKP
MOVE 0,@BY2 ;AND THE Y'S TOO
SUB 0,@BY1
ADDI 0,1
ADDM 0,DEYSKP
SOS WSIZ1 ;NOT TO MENTION X WINDOWSIZ-1
SOS WSIZY1 ;AND Y WINDOWSIZ-1
MOVE G,[MOVN TT,0(T)]
MOVE E,BPTAB(ARRY1) ;BP SKELETON
ADDI E,-1(X1)
MOVE E,(E)
SETZB B,A ;FOR SUM OF X AND X↑2, AS EXPLND BELOW
;DON'T FORGET! A,B,C,D ARE X1,X2,Y1,Y2 ALSO
ILYLP: MOVE F,E ;SETS UP IN LINE CODED
ADD F,(T) ;STUFF FOR THE INNER
MOVE TTT,WSIZ ;"LOOP" OF THE CORRELATION
ILXLP: PUSH THIS,G ;A SEQUENCE OF
ADDI G,1 ; MOVN TT,POSB(T)
ILDB C,F ; ADD A,SQRL+PIXEL(TT)
LSH C,@SHFT1
ADD A,SQRL(C)
ADD C,[ADD A,SQRL(TT)]
PUSH THIS,C
PUSH THIS,[ADD F,SQRL(TT)]
SOJG TTT,ILXLP
ADD G,DEXSKP
AOBJN T,ILYLP
PUSH THIS,[JRST INRDON] ;AND THE FINAL INSTR.
HLRE B,A
ASH B,-2
MOVEM B,SIGX ; SIGMA(X)
TLZ A,777774
MOVEM A,SIGXX ; SIGMA(X↑2)
IMUL B,B
MOVEM B,SSIGX ;SIGMA(X) ↑ 2
MOVE X1,@BX1 ;MAKE THE DESTINATION
MOVE X2,@BX2 ;WINDOW BUFFER
MOVE Y1,@BY1
MOVE Y2,@BY2
MOVEI SIZ,1(X2)
SUB SIZ,X1
MOVEM SIZ,DWSIZ
MOVEI T,1(Y2)
SUB T,Y1
IMUL SIZ,T
PUSHJ P,CORGET
HALT
MOVEM THIS,DESWIN
SUBI THIS,1
MOVN T,T ;Y COUNTER
HRLZ T,T
HRRI T,LINTAB(ARRY2)
ADD T,Y1
MOVE E,BPTAB(ARRY2) ;BYTE POINTER SKELETON
ADDI E,-1(X1) ;FOR DESTINATION
MOVE E,(E)
BUYLP: MOVE F,E ;UNPACKS THE DESTINATION
ADD F,(T) ;WINDOW, ONE WORD/SAMPLE
MOVE TTT,DWSIZ
BUXLP: ILDB 0,F
LSH 0,@SHFT2
PUSH THIS,0
SOJG TTT,BUXLP
AOBJN T,BUYLP
MOVN B,DEXSKP ;NOW ACTUALLY CORRELATE
SUBI B,1
MOVE D,[-1.0] ;VALUE OF BEST MATCH IN D
MOVE E,DESWIN ;LOCATION IN E
MOVE C,DEYSKP ;NUMBER OF ROWS
MOVE T,DESWIN ;WHERE TO START
CRYLP: HRL T,B ;INIT X CNTR, BUT KEEP OLD POSN
CRXLP: SETZB A,F ;SIG((X-Y)↑(1,2))→A, SIG(Y↑(1,2))→F
JRST @SOUWIN ;JUMP TO PREVIOUSLY CREATED CODE
INRDON: HLRE TT,F
ASH TT,-2 ;EXTRACT SIG(-Y)=-SIG(Y)
TLZ F,777774 ;AND SIG(Y↑2)
ADD F,SIGXX ;NOW SIG(Y↑2)+SIG(X↑2)
IMUL F,SOUSIZ ;NOW N*(SIG(X↑2)+SIG(Y↑2))
TLZ A,777774 ;FORM SIG((X-Y)↑2)
IMUL A,SOUSIZ ;NOW N*SIG((X-Y)↑2)
MOVN TTT,TT ;COPY SIG(Y)
IMUL TTT,SIGX ;FORM SIG(Y)*SIG(X)
ADD A,TTT ;NOW N*SIG((X-Y)↑2)+SIG(Y)*SIG(X)
ADD A,TTT ;NOW N*SIG((X-Y)↑2)+2*SIG(Y)*SIG(X)
SUB A,F ;N*S((X-Y)↑2)+2*S(Y)*S(X)-N*(S(X↑2)+S(Y↑2))
IMUL TT,TT ;FORM SIG(Y)↑2
ADD TT,SSIGX ;NOW SIG(X)↑2+SIG(Y)↑2
SUB TT,F ;NOW S(X)↑2+S(Y)↑2-N*(S(X↑2)+S(Y↑2))
FLOAT (A) ;CONVERT NUMERATOR TO FLOATING
FLOAT (TT) ;CONVERT DENOMINATOR TO FLOATING
FDVR A,TT ;FORM QUOTIENT
CAMG A,D ;SEE IF NEW MEASURE IS BETTER
JRST .+3
MOVE D,A ;IF SO, RECORD IT
HRRZ E,T
AOBJN T,CRXLP ;SHIFT IN X, AND TRY AGAIN
ADD T,WSIZ1 ;ADD WHATS NEEDED TO GET TO NEXT
SOJGE C,CRYLP ;SCANLINE, AND TRY AGAIN
SUB E,DESWIN ;DECOMPOSE SAVED BEST LOCATION
IDIV E,DWSIZ ;INTO X AND Y PARTS
ADDB E,@BY1 ;ACTUAL LOWER Y BOUND OF BEST MATCH
ADDB F,@BX1 ;ACTUAL LOWER X BOUND OF BEST MATCH
ADD F,WSIZ1 ;COMPUTE UPPER X BOUND
MOVEM F,@BX2 ;AND RETURN IT
ADD E,WSIZY1 ;UPPER Y BOUND
MOVEM E,@BY2 ;RETURNED
MOVE THIS,SOUWIN ;RETURN THE USED CORAGE
PUSHJ P,CORREL
MOVE THIS,DESWIN
PUSHJ P,CORREL
MOVE 1,D ;GET READY TO RETURN VALUE OF MATCH
JRST @RETAD ;AND RETURN
PRGEND
TITLE WIXFA1
ENTRY CLEAN,PASSHI
EXTERN SQRL,SQR
EXTERN MAKTAB,CORGET,CORREL
WIND: 0
HORWIN: 0
VERWIN: 0
NWIN: 0
WINSIZ: 0
STRIP: 0
MAPTAB: 0
STRIP2: 0
A←ARRY2←ARRYO←BESTY←3 ↔ ARRY1←ARRY←CNT2←BESTX←4 ↔ DX1←VW←0
B←T←16 ↔ C←TX←STRP←2 ↔ D←PT←PNT←5 ↔ TY←CNT←6
SUMSQ←E←TXX←HC←7 ↔ PND←DX2←VC←10 ↔ PNC←X1←D1C←11
PNE←Y1←D2C←12 ↔ PN1←X2←CNT1←13
CC←Y2←TOP←14 ↔ DY1←POS←15 ↔ SUM←1 ↔ DL←17
THIS←2 ↔ SIZ←3
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BPTAB←←12
LINTAB←←13
PICWID: 0 ↔ BICWID: 0
PICLIN: 0 ↔ BICLIN: 0
PICHIG: 0 ↔ BICHIG: 0
PICBIT: 0 ↔ BICBIT: 0
PICWIZ: 0 ↔ BICWIZ: 0
PICSIZ: 0 ↔ BICSIZ: 0
COLTAB: 0 ↔ BOLTAB: 0
ROWTAB: 0 ↔ BOWTAB: 0
SETUP: 0
MOVE T,PCWD(ARRY) ;SET "GLOBALS" FOR COMPATABILITY WITH
MOVEM T,PICSIZ ;OLD FORMAT
MOVE T,LNBYA(ARRY)
MOVEM T,PICWIZ
MOVE T,BYBI(ARRY)
MOVEM T,PICBIT
MOVE T,PCLN(ARRY)
MOVEM T,PICHIG
MOVE T,LNWD(ARRY)
MOVEM T,PICLIN
MOVE T,LNBY(ARRY)
MOVEM T,PICWID
MOVE T,BPTAB(ARRY)
MOVEM T,COLTAB
MOVEI T,LINTAB(ARRY)
MOVEM T,ROWTAB
MOVE ARRY,(T)
JRST @SETUP
SETUP2: 0
MOVE T,PCWD(ARRY2) ;SET SIMILAR VARIABLES FOR SECOND ARRAY
MOVEM T,BICSIZ
MOVE T,LNBYA(ARRY2)
MOVEM T,BICWIZ
MOVE T,BYBI(ARRY2)
MOVEM T,BICBIT
MOVE T,PCLN(ARRY2)
MOVEM T,BICHIG
MOVE T,LNWD(ARRY2)
MOVEM T,BICLIN
MOVE T,LNBY(ARRY2)
MOVEM T,BICWID
MOVE T,BPTAB(ARRY2)
MOVEM T,BOLTAB
MOVEI T,LINTAB(ARRY2)
MOVEM T,BOWTAB
MOVE ARRY2,(T)
JRST @SETUP2
CLN: 0
MOVE CNT,PICWIZ
SUBI CNT,2
MOVE A,PICHIG
SUBI A,2
IMUL CNT,A
HRLZ PND,PICBIT
LSH PND,6
ADDI PND,-1(ARRY)
MOVE PNC,PND
ADD PNC,PICLIN
ILDB B,PNC
MOVE PNE,PNC
ADD PNE,PICLIN
ILDB A,PNC
MOVE PN1,PNC
ILDB CC,PNC
IBP PND
ILDB D,PND
ILDB E,PNE
WOOP: MOVE C,CC
CAMLE B,C
EXCH B,C
CAMLE D,E
EXCH D,E
CAMLE B,D
EXCH B,D
CAMLE C,E
EXCH C,E
CAMLE C,D
EXCH C,D
CAMLE A,D
DPB D,PN1
CAMGE A,C
DPB C,PN1
MOVE PN1,PNC
MOVE B,A
MOVE A,CC
ILDB CC,PNC
ILDB D,PND
ILDB E,PNE
SOJG CNT,WOOP
JRST @CLN
HIPASS: 0 ;HI PASS FILTERING
MOVE T,BOLTAB ;SET UP RIGHT INDEX TABLE REFERENCES
SUBI T,1
HRRM T,BOLF
MOVE T,BOWTAB
SUBI T,1
HRRM T,BOWF
MOVE T,MAPTAB
HRRM T,SMT1
HRRM T,SMT2
MOVE T,STRIP2
HRRM T,S2R1
HRRM T,S2R2
HRRM T,S2R3
HRRM T,S2R4
HRRM T,S2R5
SUBI T,1
HRRM T,CO
MOVEI E,1
ASH E,@PICBIT
MOVE C,E
ASH C,1
SUBI E,1
MOVE CNT,E
HRRM CNT,TABTS
HRRM CNT,TABTS+1
ASH CNT,-1
HRRM CNT,TABL
MOVN E,E
TABL: HRREI VW,100(E)
CAIGE VW,0
MOVEI VW,0
TABTS: CAILE VW,77
MOVEI VW,77
SMT1: MOVEM VW,MAPTAB(E)
ADDI E,1
SOJG C,TABL
BRK: HRL E,ARRY1
HRR E,ARRY2
MOVE C,ARRY2
ADD C,PICSIZ
SUBI C,1
BLT E,(C)
MOVN CNT,PICWIZ
HRLZ CNT,CNT
HRLZ PNT,PICBIT
LSH PNT,6
ADDI PNT,-1(ARRY)
MOVE PN1,PNT
MOVE B,CNT
CL: ILDB VW,PNT
S2R1: MOVEM VW,STRIP2(B)
AOBJN B,CL
MOVE E,WIND
SOJLE E,NADD
CN: MOVE B,CNT
CM: ILDB VW,PNT
S2R2: ADDM VW,STRIP2(B)
AOBJN B,CM
SOJG E,CN
NADD: MOVE DL,WIND
ASH DL,-1
BOLF: MOVE ARRY2,BOLTAB-1(DL) ;REPLACED BY REAL BOLTAB ADDRESS
BOWF: ADD ARRY2,BOWTAB-1(DL) ;DITTO FOR BOWTAB
MOVE C,WIND
SUB C,PICWIZ
HRLZ C,C
S2R3: MOVEI VW,STRIP2
ADD VW,WIND
HRRM VW,SUMST
MOVE E,PICHIG
SUB E,WIND
CR: SETZ SUM,
MOVE B,WIND
CO: ADD SUM,STRIP2-1(B)
SOJG B,CO
MOVE B,C
MOVE PND,PICLIN
ADDB PND,ARRY2
CP: MOVE CC,WINSIZ
IDIVM SUM,CC
ILDB DY1,PND
SHFST: SUB DY1,CC
SMT2: MOVE DY1,MAPTAB(DY1)
DPB DY1,PND
S2R4: SUB SUM,STRIP2(B)
SUMST: ADD SUM,STRIP2(B) ;CHANGED TO STRIP+<WIND>
AOBJN B,CP
MOVE B,CNT
CQ: ILDB CC,PN1
ILDB VW,PNT
SUB VW,CC
S2R5: ADDM VW,STRIP2(B)
AOBJN B,CQ
SOJGE E,CR
JRST @HIPASS
;***** WIXFA1 SAIL INTERFACE ********
P←17
ACS12: 0
ACS16: 0
ACS17: 0
RETAD: 0
ACS: BLOCK 20
ARN1: 0
ARN2: 0
PASSHI: MOVEM 12,ACS12
MOVEM 16,ACS16
POP P,RETAD
POP P,ARRY2
POP P,WIND
POP P,ARRY1
HRL T,ARRY1
HRR T,ARRY2
BLT T,12(ARRY2)
MOVE T,ARRY2
SUB T,ARRY1
ADDM T,12(ARRY2)
MOVEM ARRY1,ARN1
MOVEM ARRY2,ARN2
PUSH P,ARRY2
PUSHJ P,MAKTAB
MOVE ARRY1,ARN1
MOVE ARRY2,ARN2
JSR SETUP
JSR SETUP2
MOVE 1,PICWID ;SET UP WINDOW PARAMETERS
SUBI 1,1
IDIV 1,WIND
MOVEM 1,HORWIN
MOVE 1,PICHIG
SUBI 1,1
IDIV 1,WIND
MOVEM 1,VERWIN
IMUL 1,HORWIN
MOVEM 1,NWIN
MOVE 1,WIND
IMUL 1,1
MOVEM 1,WINSIZ
MOVEM 16,ACS+16 ;SET UP UNPACKING AND MAP TABLE AREAS
MOVEI 16,ACS
BLT 16,ACS+15
MOVEI SIZ,1
ASH SIZ,@PICBIT
MOVEM SIZ,MAPTAB
ASH SIZ,1
PUSHJ 17,CORGET
HALT
MOVEM THIS,STRIP
ADDM THIS,MAPTAB
MOVE SIZ,PICWIZ
PUSHJ 17,CORGET
HALT
MOVEM THIS,STRIP2
HRLZI 16,ACS
BLT 16,16
MOVEM 17,ACS17
JSR HIPASS
MOVE 17,ACS17
MOVE 16,ACS16
MOVE 12,ACS12
MOVE THIS,STRIP
PUSHJ 17,CORREL
MOVE THIS,STRIP2
PUSHJ 17,CORREL
JRST @RETAD
CLEAN: MOVEM 12,ACS12
MOVEM 16,ACS16
POP P,RETAD
POP P,ARRY
JSR SETUP
MOVEM 17,ACS17
JSR CLN
MOVE 12,ACS12
MOVE 16,ACS16
MOVE 17,ACS17
JRST @RETAD
PRGEND
TITLE TEMP
ENTRY SQR,SQRL,TEMP
TEMP: BLOCK 50 ;TEMPORARY STORAGE FOR STUFF
FOR I←-40,-1,1 { I*4000000+I*I
}
SQRL: FOR I←0,40,1 { I*4000000+I*I
}
FOR I←-200,-1,1 { I*I
}
SQR: FOR I←0,200,1 { I*I
}
END